`
https://leetcode.cn/problems/longest-non-decreasing-subarray-after-replacing-at-most-one-element/
`

/**
 * @param {number[]} nums
 * @return {number}
 */
var longestSubarray = function (nums) {
  const n = nums.length
  if (n <= 1) return 1
  let res = 2
  // suf[i] 表示以 nums[i] 开头的最长非递减子数组的长度
  const suf = new Array(n)
  suf[n - 1] = 1
  for (let i = n - 2; i > 0; i--) {
    if (nums[i] <= nums[i + 1]) {
      suf[i] = suf[i + 1] + 1
      res = Math.max(res, suf[i] + 1)
    } else {
      suf[i] = 1
    }
  }

  // pre[i] 表示以 nums[i] 结尾的最长非递减子数组的长度
  // 这里可以简化成一个变量
  let pre = 1
  for (let i = 1; i < n - 1; i++) {
    if (nums[i - 1] <= nums[i + 1]) {
      // 前后能接上
      res = Math.max(res, pre + 1 + suf[i + 1])
    }
    if (nums[i - 1] <= nums[i]) {
      pre += 1
      res = Math.max(res, pre + 1)
    } else {
      pre = 1
    }
  }

  return res
};